package hygprs

/*
数据包编辑器接口
用来编辑不同类型的数据包
注意编辑过程中会修改原数据!所以加载之前可以用Copy复制一份数据
*/
type Editor interface {
	/*
		加载数据包
		出现错误时返回false和错误原因
	*/
	Load(data []byte) (reason string, ok bool)
	/*
		计算并写入校验和，结束编辑
	*/
	Done() []byte
	/*
		获取字段的方法
	*/
	//GetXX() type
	/*
		设置字段的方法
	*/
	//SetXX(v type)
	/*
		判断是否符合某个子类
	*/
	//IsXX() bool
	/*
		转换成某个子类
	*/
	//ToXX() Editor
	/*
		获取一个模板数据
	*/
	//TemplateXX() []byte
	/*
		生成其他的数据
	*/
	//MakeXX(...type) []byte
}

/*
基础编辑器
实现通用的加载和完成方法
*/
type base struct {
	data []byte
}

func (e *base) Load(data []byte) (reason string, ok bool) {
	if len(data) < 12 {
		return "数据包过短", false
	}
	e.data = data
	return "", true
}

func (e *base) Done() []byte {
	position := len(e.data) + PositionChecksum // 校验和的起始位置
	copy(e.data[position:], FromUint32(CheckSum(e.data[:position])))
	return e.data
}

/*
以线路、车号、操作者、时间四个字段开始的数据包可以通用的基础编辑器
*/
type base1246 struct {
	base
}

func (e *base1246) Load(data []byte) (reason string, ok bool) {
	if len(data) < 32 {
		return "数据包过短", false
	}
	if data[7] != 0x01 || data[12] != 0x02 || data[17] != 0x04 || data[22] != 0x06 {
		return "数据格式错误", false
	}
	e.data = data
	return "", true
}

func (e *base1246) GetLineID() uint32 {
	return ToUint32(e.data[8:12])
}

func (e *base1246) SetLineID(v uint32) {
	copy(e.data[8:12], FromUint32(v))
}

func (e *base1246) GetBusID() uint32 {
	return ToUint32(e.data[13:17])
}

func (e *base1246) SetBusID(v uint32) {
	copy(e.data[13:17], FromUint32(v))
}

func (e *base1246) GetOperatorID() uint32 {
	return ToUint32(e.data[18:22])
}

func (e *base1246) SetOperatorID(v uint32) {
	copy(e.data[18:22], FromUint32(v))
}

func (e *base1246) GetTimeStamp() uint32 {
	return ToUint32(e.data[23:27])
}

func (e *base1246) SetTimeStamp(v uint32) {
	copy(e.data[23:27], FromUint32(v))
}
